<?php
/**
 * Created by PhpStorm.
 * User: admin
 * Date: 2021/8/31
 * Time: 9:51
 */
namespace app\admin\controller;

use app\BaseController;
use app\middleware\AdminCheck;
use think\facade\Db;

class Role extends BaseController{

    protected $middleware = [
        AdminCheck::class => ['except' 	=> [] ]
    ];

    /**
     * 创建角色
     * @return \think\response\Json
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public function add(){
        validateParam('role,label','role,label');
        //首先判断role code是否重复
        $role = Db::name('system_role')
            ->where(['role'=>input('role')])
            ->find();
        if(!empty($role)){
            //提醒不可以重复
            return error('角色code重复，请更换code');
        }
        //直接进行创建
        $data['role']=input('role');
        $data['label']=input('label');//角色名称
        $data['update_at']=currentTime();
        $data['create_at']=currentTime();
        Db::name('system_role')->insert($data);

        return success('创建角色成功');
    }


    /**
     * 角色编辑
     * @return \think\response\Json
     * @throws \think\db\exception\DbException
     */
    public function edit(){
        validateParam('id,role,label','id,role,label');
        $role = Db::name('system_role')
            ->where(['role'=>input('role')])
            ->where('id','<>',input('id'))
            ->find();
        if(!empty($role)){
            //提醒不可以重复
            return error('角色code重复，请更换code');
        }
        //直接进行创建
        $data['id']=input('id');
        $data['role']=input('role');
        $data['label']=input('label');//角色名称
        $data['update_at']=currentTime();
        Db::name('system_role')->update($data);
        return success('编辑角色成功');
    }


    /**
     * 获取所有的角色列表
     * @return \think\response\Json
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public function roleList(){
        validateParam('pageNo,pageSize,role','pageNo,pageSize');
        $role = input('role');
        $pageNo=input('pageNo');
        $pageSize=input('pageSize');
        if(empty($role)) {
            $total = Db::name('system_role')
                ->count();

            $offset = makeOffset($pageNo, $pageSize);

            $list = Db::name('system_role')
                ->field('id,role,label')
                ->order('create_at desc')
                ->limit($offset, $pageSize)
                ->select();
        }else{
            $total = Db::name('system_role')
                ->where('label','like',"%$role%")
                ->count();

            $offset = makeOffset($pageNo, $pageSize);

            $list = Db::name('system_role')
                ->field('id,role,label')
                ->where('label','like',"%$role%")
                ->order('create_at desc')
                ->limit($offset, $pageSize)
                ->select();
        }
        return success('角色列表',['list'=>$list,'total'=>$total]);
    }


    /**
     * 根据角色获取所有的菜单以及配置选中的菜单
     * @return \think\response\Json
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public function roleMenuList(){
        validateParam('role_id','role_id');
        $menu_ids=Db::name('system_role')
            ->where(['id'=>input('role_id')])
            ->value('menu_ids');
        //获取当前角色的menu id
        if(!empty($menu_ids)) {
            $menu_ids = json_decode($menu_ids, true);
        }else{
            $menu_ids = [];
        }
        //获取所有的菜单
        $menuList=Db::name('system_menu')
            ->order('sort desc')
            ->select()->toArray();
        foreach ($menuList as $k=>$v){
            //json序列化meta
            $menuList[$k]['meta'] = json_decode($v['meta'],true);
            if(in_array($v['id'],$menu_ids)){
                //如果当前的menu_id在角色授权的menu_id数组中，则被checked
                $menuList[$k]['checked']=true;
            }else{
                $menuList[$k]['checked']=false;
            }
        }
        //递归获取树状结构
        $menu=getMenuTree($menuList);
        return success('获取菜单成功',$menu);
    }


    /**
     * 角色授权
     * @return \think\response\Json
     * @throws \think\db\exception\DbException
     */
    public function authorize(){
        validateParam('menu_ids,role_id','menu_ids,role_id');
        if(!is_array(input('menu_ids'))){
            return error('参数错误：menu_ids为数组类型');
        }
        Db::name('system_role')
            ->where(['id'=>input('role_id')])
            ->update(['menu_ids'=>json_encode(input('menu_ids')),'update_at'=>currentTime()]);
        return success('角色授权成功');
    }


    /**
     * 删除角色
     * @return \think\response\Json
     * @throws \think\db\exception\DbException
     */
    public function delete(){
        validateParam('ids','ids');
        Db::name('system_role')
            ->where('id','in',input('ids'))
            ->delete();
        return success('删除角色成功');
    }



}